package com.xs.tool.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author 孙泽权
 * @email 1226112135@qq.com
 * @date 2021/3/26 下午4:55
 * @description fastjson工具类
 */
public class JSONUtil {
    private static final SerializeConfig config;

    static {
        config = new SerializeConfig();
        config.put(java.util.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式
        config.put(java.sql.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式
    }

    /**
     *
     */
    private static final SerializerFeature[] features = {
            SerializerFeature.WriteMapNullValue, // 输出空置字段
            SerializerFeature.WriteNullListAsEmpty, // list字段如果为null，输出为[]，而不是null
            SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null，输出为0，而不是null
            SerializerFeature.WriteNullBooleanAsFalse, // Boolean字段如果为null，输出为false，而不是null
            SerializerFeature.WriteNullStringAsEmpty // 字符类型字段如果为null，输出为""，而不是null
    };

    /**
     * fastjson 对数据进行格式化
     */
    private static final SerializerFeature[] featuresEchart = {
            SerializerFeature.WriteNullStringAsEmpty,
            SerializerFeature.DisableCircularReferenceDetect,
            SerializerFeature.WriteDateUseDateFormat,
            SerializerFeature.DisableCheckSpecialChar,
            SerializerFeature.WriteNullListAsEmpty,
            SerializerFeature.WriteNullBooleanAsFalse,
            SerializerFeature.WriteSlashAsSpecial,
            SerializerFeature.WriteMapNullValue,
            SerializerFeature.BrowserCompatible};

    /**
     * 转换json 日期会变成 "createDate":{"date":21,"day":6,"hours":11,"minutes":24,"month":11,"seconds":19,"time"
     * @param object
     * @return
     */
    public static String convertObjectToJSON(Object object) {
        return JSON.toJSONString(object, config, features);
    }

    public static String toJSONNoFeatures(Object object) {
        return JSON.toJSONString(object, config);
    }

    /**
     * 文本转换成对象
     * 实体类强转报错
     * @param text json文本内容
     * @return
     */
    public static Object toBean(String text) {
        return JSON.parse(text);
    }

    /**
     * 转换成 JSONObject
     * @param text json 文本字符串
     * @return
     */
    public static JSONObject toJSONObject(String text) {
        return JSONObject.parseObject(text);
    }

    /**
     * 转换成 JSONObject
     * @param text json 文本字符串
     * @return
     */
    public static JSONObject jsonParse(String text) {
        return JSON.parseObject(text);
    }

    /**
     * json 字符串转换成实体对象
     * @param text json 文本内容
     * @param clazz 实体对象class
     * @param <T> 返回需要的对象
     * @return
     */
    public static <T> T toBean(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    // 转换为数组
    public static <T> Object[] toArray(String text) {
        return toArray(text, null);
    }

    // 转换为数组
    public static <T> Object[] toArray(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz).toArray();
    }

    // 转换为List
    public static <T> List<T> toList(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz);
    }

    /**
     * 将string转化为序列化的json字符串
     * @param text
     * @return
     */
    public static Object textToJson(String text) {
        Object objectJson  = JSON.parse(text);
        return objectJson;
    }

    /**
     * json字符串转化为map
     * @param s
     * @return
     */
    public static <K, V> Map<K, V> stringToCollect(String s) {
        Map<K, V> m = (Map<K, V>) JSONObject.parseObject(s);
        return m;
    }

    /**
     * 转换JSON字符串为对象
     * @param jsonData
     * @param clazz
     * @return
     */
    public static Object convertJsonToObject(String jsonData, Class<?> clazz) {
        return JSONObject.parseObject(jsonData, clazz);
    }


    public static Object convertJSONToObject(String content, Class<?> clazz) {
        return JSONObject.parseObject(content, clazz);
    }

    /**
     * 将map转化为string
     * @param m
     * @return
     */
    public static <K, V> String collectToString(Map<K, V> m) {
        String s = JSONObject.toJSONString(m);
        return s;
    }

    /***
     * 解析为字符串
     *
     * @param jsonString json字符串
     * @param key 关键字
     * @return  返回值
     */
    public static String fromString(String jsonString, String key) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                JSONObject jsonObject = JSONObject.parseObject(jsonString);
                return jsonObject.getString(key);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /***
     * 解析为布尔
     *
     * @param jsonString json字符串
     * @param key 关键字
     * @return  返回值
     */
    public static Boolean formBoolean(String jsonString, String key) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                JSONObject jsonObject = JSONObject.parseObject(jsonString);
                return jsonObject.getBoolean(key);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 提取json字符串中的某个属性的值并且值是字符串
     * @param jsonString json 字符串
     * @param key json字符串中的某个属性
     * @param skey 与key名称一致
     * @return
     */
    public static String formString(String jsonString, String key, String skey) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                JSONObject jsonObject = JSONObject.parseObject(jsonString);
                JSONObject jsonObject1 = jsonObject.getJSONObject(key);
                String jsonObject2 = jsonObject1.getString(skey);
                return jsonObject2;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /***
     * 解析为Int
     *
     * @param jsonString json字符串
     * @param key 关键字
     * @return  返回值
     */
    public static int formInt(String jsonString, String key, String skey) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                JSONObject jsonObject = JSONObject.parseObject(jsonString);
                JSONObject jsonObject1 = jsonObject.getJSONObject(key);
                int jsonObject2 = jsonObject1.getInteger(skey);
                return jsonObject2;
            } else {
                return -1;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

    /***
     * 解析为数字
     *
     * @param jsonString json字符串
     * @param key 关键字
     * @return  返回值
     */
    public static Integer formInteger(String jsonString, String key) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                JSONObject jsonObject = JSONObject.parseObject(jsonString);
                return jsonObject.getInteger(key);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /***
     * 解析为长位十进制数
     *
     * @param jsonString json字符串
     * @param key 关键字
     * @return  返回值
     */
    public static BigDecimal formBigDecimal(String jsonString, String key) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                JSONObject jsonObject = JSONObject.parseObject(jsonString);
                return jsonObject.getBigDecimal(key);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /***
     * 解析为双精度
     *
     * @param jsonString json字符串
     * @param key 关键字
     * @return  返回值
     */
    public static Double formDouble(String jsonString, String key) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                JSONObject jsonObject = JSONObject.parseObject(jsonString);
                return jsonObject.getDouble(key);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /***
     * 解析为浮点数
     *
     * @param jsonString json字符串
     * @param key 关键字
     * @return  返回值
     */
    public static Float formFloat(String jsonString, String key) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                JSONObject jsonObject = JSONObject.parseObject(jsonString);
                return jsonObject.getFloat(key);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /***
     * 解析为对象
     *
     * @param jsonString json字符串
     * @param key 需要解析的关键字
     * @param t 泛型
     * @param <T> 泛型
     * @return 返回的对象
     */
    public static <T> T fromBean(String jsonString, String key, Class<T> t) {
        if (jsonString != null) {
            try {
                JSONObject jsonObj = JSONObject.parseObject(jsonString);
                return JSONObject.toJavaObject(jsonObj.getJSONObject(key), t);
            } catch (Exception e) {
                return null;
            }
        } else {
            return null;
        }
    }

    /***
     * 解析为列表
     *
     * @param jsonString json字符串
     * @param key 需要解析的关键字
     * @param t 泛型
     * @param <T>   泛型
     * @return 返回的列表
     */
    public static <T> ArrayList<T> fromList(String jsonString, String key, Class<T> t) {
        ArrayList<T> list = new ArrayList<T>();
        if (jsonString != null && jsonString.length() > 0) {
            try {
                JSONObject jsonObj = JSONObject.parseObject(jsonString);
                JSONArray inforArray = jsonObj.getJSONArray(key);
                for (int index = 0; index < inforArray.size(); index++) {
                    list.add(JSONObject.toJavaObject(
                            inforArray.getJSONObject(index), t));
                }
            } catch (Exception e) {
            }
        }
        return list;
    }

    /***
     * 直接解析为bean
     *
     * @param jsonString json字符串
     * @param t 泛型
     * @param <T> 泛型
     * @return 返回的bean
     */
    public static <T> T fromBean(String jsonString, Class<T> t) {
        try {
            if (jsonString != null && jsonString.length() > 0) {
                return JSON.parseObject(jsonString, t);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /***
     * 直接解析为list
     *
     * @param jsonString json字符串
     * @param t 泛型
     * @param <T> 泛型
     * @return 返回的泛型数组
     */
    public static <T> ArrayList<T> fromList(String jsonString, Class<T> t) {
        ArrayList<T> list = null;
        try {
            list = new ArrayList<>();
            if (jsonString != null && jsonString.length() > 0) {
                list.addAll(JSON.parseArray(jsonString, t));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }


    /***
     * 将列表转换为json
     *
     * @param listBean 泛型数组
     * @return json字符串
     */
    public static <T> String ArrayToJson(ArrayList<T> listBean) {
        String jsonString = JSON.toJSONString(listBean);
        return jsonString;
    }

    /***
     * 将类转为json
     * 如果为空会导致没有字符串输出，只会输出有值的字段
     * @param <T> 泛型
     * @return json字符串
     */
    public static <T> String toJson(Object obj) {
        if(null == obj){
            return null;
        }
        String jsonsString = JSON.toJSONString(obj);
        return jsonsString;
    }
    /**
     * 将类转为json
     *
     * @param <T> 泛型
     * @return json字符串
     */
    public static <T> String toJsonFeaturesEchart(Object obj) {
        if(null == obj){
            return null;
        }
        String jsonsString =  JSON.toJSONString(obj,featuresEchart);
        return jsonsString;
    }
    /**
     * 将类转为json
     *
     * @param <T> 泛型
     * @return json字符串
     */
    public static <T> String toJsonFeatures(Object obj) {
        if(null == obj){
            return null;
        }
        String jsonsString =  JSON.toJSONString(obj,features);
        return jsonsString;
    }

    public static String toJsonObjectString(Object obj){
        if(null == obj){
            return null;
        }
        String jsonsString = JSON.toJSONString(obj);
        return jsonsString;
    }
}
